<?php
namespace App\Controllers;
use App\Services\OpenAiService as Service;
use Framework\OpenAi\ChatGPT;
use Framework\OpenAi\DFA;
use Framework\BaseController;
use Illuminate\Http\Request;
class OpenAiController extends BaseController
{
    /**
     * @var Service
     */
    private $service;

    public function __construct(Service $service)
    {
        $this->service = $service;
    }

    public function postOpenAi(Request $request)
    {

        $content = $request->input('content');
        if(empty($content)){
            $this->retError("内容不能为空");
        }
        // 设置时区为东八区
        date_default_timezone_set('PRC');
        /*
        以下几行比较长的注释由 GPT4 生成
        */
        // 这行代码用于关闭输出缓冲。关闭后，脚本的输出将立即发送到浏览器，而不是等待缓冲区填满或脚本执行完毕。
        ini_set('output_buffering', 'off');
        // 这行代码禁用了 zlib 压缩。通常情况下，启用 zlib 压缩可以减小发送到浏览器的数据量，但对于服务器发送事件来说，实时性更重要，因此需要禁用压缩。
        ini_set('zlib.output_compression', false);

        // 这行代码使用循环来清空所有当前激活的输出缓冲区。ob_end_flush() 函数会刷新并关闭最内层的输出缓冲区，@ 符号用于抑制可能出现的错误或警告。
        while (@ob_end_flush()) {}

        // 这行代码设置 HTTP 响应的 Content-Type 为 text/event-stream，这是服务器发送事件（SSE）的 MIME 类型。
        header('Content-Type: text/event-stream');

        // 这行代码设置 HTTP 响应的 Cache-Control 为 no-cache，告诉浏览器不要缓存此响应。
        header('Cache-Control: no-cache');

        // 这行代码设置 HTTP 响应的 Connection 为 keep-alive，保持长连接，以便服务器可以持续发送事件到客户端。
        header('Connection: keep-alive');

        // 这行代码设置 HTTP 响应的自定义头部 X-Accel-Buffering 为 no，用于禁用某些代理或 Web 服务器（如 Nginx）的缓冲。
        // 这有助于确保服务器发送事件在传输过程中不会受到缓冲影响。
        header('X-Accel-Buffering: no');

        echo  'data: '.json_encode(['time'=>date('Y-m-d H:i:s'), 'content'=>'']).PHP_EOL.PHP_EOL;
        flush();


        $question = urldecode($content);
        if(empty($question)) {
            echo "event: close".PHP_EOL;
            echo "data: Connection closed".PHP_EOL.PHP_EOL;
            flush();
            exit();
        }
        $question = str_ireplace('{[$add$]}', '+', $question);
        $chat = new ChatGPT([
            'api_key' => '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',
        ]);
        // 敏感词过滤
//        $dfa = new DFA([
//            'words_file' => './sensitive_words_sdfdsfvdfs5v56v5dfvdf.txt',
//        ]);
//        $chat->set_dfa($dfa);


        // 开始提问
        $chat->qa([
            'system' => '你是一个智能机器人',
            'question' => $question,
        ]);
    }
}
